<?php
class Model {

	public $table;		// Variable globale qui change en fonction du modèle
	public $db;			// Contient l'objet de connexion a la bdd


	// Contructeur qui se connect à la bdd
	public function __construct(){
		$serv = '127.0.0.1';
		$user = 'root';
		$pass = '';
		$bdd = 'webdls';

		try {
			$pdo = new PDO('mysql:host='.$serv.';dbname='.$bdd, $user, $pass, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
			$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

			$this->db = $pdo;
		}
		catch (PDOException $e){
			echo 'Connection impossible <br/>';
			die($e->getMessage());
		}
	}

	/**
	 * Permet de charger un model supplémentaire (pour accéder à d'autre table)
	 * @param $name nom du model (et de la table car les noms doivent être identiques) que l'on veut charger
	 */
	static function loadModel($name){
		require_once ROOT.'Models/'.strtolower($name).'.php';
		return new $name();
	}


	/**
	 * Permet de faire une requête SELECT pour lire des info correspondant à l'id en cour
	 * @param $fiels champs que l'on veux sélectionner (null par défaut --> sélectionne tous les champs)
	 */
	public function read($fields=null){
		if ($fields == null){
			$fields = "*";
		}
		$sql = "SELECT $fields FROM $this->table WHERE id=".$this->id;
		$req = $this->db->query($sql);
		return $req->fetch(PDO::FETCH_OBJ);
	}

	/**
	 * Permet d'insérer ou de mettre à jour des info dans la bdd
	 * @param $data (tableau) données que l'on veut sauvegarder
	 */
	public function save($data){
		// si le tableau contient un id alors on UPDATE
		if (isset($data['id']) && !empty($data['id'])){
			$sql = "UPDATE $this->table SET ";
			foreach ($data as $k =>$v){
				if ($k != 'id'){
					$v = addcslashes($v, "'");
					$sql .=("$k='$v',");
				}
			}
			$sql = substr($sql, 0, -1);
			$sql.= " WHERE id=".$data['id'];
		}
		// sinon on INSERT
		else{
			$sql = "INSERT INTO $this->table (";
			foreach ($data as $k =>$v){
				if ($k != 'id'){
					$sql .= "$k,";
				}
			}
			$sql = substr($sql, 0, -1);
			$sql.= ") VALUES (";
			foreach ($data as $k => $v){
				if ($k != 'id'){
					if (!is_numeric($v)){
						$v = addcslashes($v, "'");
						$sql .= "'$v',";
					}
					else {
						$sql .= "$v,";
					}
				}
			}
			$sql = substr($sql, 0, -1);
			$sql .= ")";
		}
		//var_dump($sql); die();
		$req = $this->db->query($sql) or die("Erreur");
	}

	/**
	 * Permet de sélectionner les champs que l'on veut dans la bdd
	 * @param $data tableau qui contient les differents paramètres de la requete comme conditions, fields, limit, order
	 */
	public function find($data=array()){
		$conditions = "1=1";
		$fields = "*";
		$limit = "";
		$order = "id DESC";
		

		if (isset($data['conditions'])){
			$conditions = $data['conditions'];
		}
		if (isset($data['fields'])){
			$fields = $data['fields'];
		}
		if (isset($data['limit'])){
			$limit = ' LIMIT '.$data['limit'];
		}
		if (isset($data['order'])){
			$order = $data['order'];
		}
		$sql = "SELECT DISTINCT $fields FROM $this->table WHERE $conditions ORDER BY $order $limit";
		//var_dump($sql); die();
		$req = $this->db->query($sql);
		return $req->fetchAll(PDO::FETCH_OBJ);
	}

	/**
	 * Permet de trouver le premier resultat d'une requête
	 * @param $data tableau qui contient les differents paramètres de la requete comme conditions, fields, limit, order
	 */
	public function findFirst($data)
	{
		$this->find($data);
		return current($this->find($data));
	}

	/**
	 * Permet de compter combien de resultat comporte la requête
	 * @param $data tableau qui contient les differents paramètres de la requete comme conditions
	 */
	public function count($data=array()){
		$conditions = "1=1";

		if (isset($data['conditions'])){
			$conditions = $data['conditions'];
		}
		$sql = "SELECT COUNT(*) AS nb FROM $this->table WHERE $conditions";
		$req = $this->db->query($sql);
		return $req->fetch(PDO::FETCH_OBJ);
	}

	/**
	 * Permet de supprimer des données de la bdd
	 * @param $id id de la ligne à supprimer
	 */
	public function delete($id){
		$sql = "DELETE FROM $this->table WHERE id=".$id;
		$req = $this->db->query($sql);	
	}

}

?>